package com.jinsp.webviewservice.webview;

import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.webkit.JavascriptInterface;
import android.webkit.WebView;

import com.google.gson.Gson;
import com.jinsp.webviewservice.bean.ParamDataBean;
import com.jinsp.webviewservice.command.CommandDispatcher;

/**
 * Created by luoshuai on 12/30/21
 * <p>
 * 自定义WebView
 */
public class CustomWebView extends WebView {

    public static final String TAG = CustomWebView.class.getCanonicalName();

    public CustomWebView(Context context) {
        this(context, null);
    }

    public CustomWebView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        //初始化
        DefaultWebViewSettings.getInstance().initWebViewSettings(this);
        //连接远程主进程服务
        CommandDispatcher.getInstance().connectService(context);
    }

    /**
     * 注册回调信息
     *
     * @param webViewCallback 回调函数
     * @param webViewName     HTML调用WebView名称
     */
    public void registerWebViewCallback(IWebViewCallback webViewCallback, String webViewName) {
        if (webViewCallback != null) {
            setWebChromeClient(new DefaultWebChromeClient(webViewCallback));
            setWebViewClient(new DefaultWebViewClient(webViewCallback));
        }
        addJavascriptInterface(this, webViewName);
    }

    /**
     * 执行HTML命令
     *
     * @param jsonData HTML的json数据
     */
    @JavascriptInterface
    public void takeNativeAction(String jsonData) {
        //接收到WebView子进程数据，回传主进程处理
        Log.d(TAG, "接收HTML返回JSON数据: " + jsonData);
        if (!TextUtils.isEmpty(jsonData)) {
            Gson gson = new Gson();
            ParamDataBean paramDataBean = gson.fromJson(jsonData, ParamDataBean.class);
            if (paramDataBean != null) {
                //命令处理
                CommandDispatcher.getInstance().executeCommand(paramDataBean.getCommandName(),
                        gson.toJson(paramDataBean.getData()), this);
            }
        }
    }

    /**
     * 主进程发送数据到HTML，运行于binder池
     *
     * @param jsCode javascript执行函数eg.（"javascript:js函数名（参数）"）
     */
    public void sendDataFromAndroid(String jsCode) {
        if (!TextUtils.isEmpty(jsCode)) {
            post(() -> evaluateJavascript(jsCode, null));
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        CommandDispatcher.getInstance().disconnect(getContext());
    }
}
